(function () {
  /*
        以abstract开头的是抽象类
            - 抽象类是不可以直接被实例化的，其他与普通类并无不同
            - 抽象类就是专门用来被继承的类
            - 就以这个Animal类来说，我们希望用它来衍生出更多的动物类，比如猫、狗，我们并不希望谁真的实例化Animal这个类，这就是抽象类的作用
            - 抽象类可以添加抽象方法

    */
  abstract class Animal {
    name: string;
    constructor(name: string) {
      this.name = name;
    }

    // 抽象方法也是使用abstract开头，没有方法体，抽象方法只能定义在抽象类里面，且子类必须对抽象方法进行重写
    abstract sayHello(): void;
  }

  class Cat extends Animal {
    constructor(name: string) {
      super(name);
    }

    // Cat类必须把父类的抽象方法重写才行
    sayHello(): void {
      console.log("喵喵喵");
    }
  }

  const cat = new Cat('咪咪');
  cat.sayHello();
})();
